<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>用递归实现深拷贝</title>
</head>
<body>
<script>
  // 终极解决方案: 递归。 因为我们无法确定原始对象里面的嵌套层数，因此可以借助递归的方法，再次调用拷贝函数，直到最深层数据为基本类型。
  var obj = {
    name: 'zs',
    age: '18',
    friends: ['Kate', 'Bob', 'Mike'],
    hobby: {
      hobby1: 'codes',
      hobby2: 'lol'
    }
  }
  function deepCopy(origin, target) {
    // 目标值先置空
    var target = null
    // 判断原始对象的数据类型 typeof在判断null、array、object时，得到的都是object
    if(typeof origin ==='object' && origin !== null) { // 注意typeof(null) 返回的也是'object'(字符串)
      // 判断拷贝的是数组还是对象
      target = origin instanceof Array ? [] : {}
      for (var key in origin) {
        // 递归拷贝
        target[key] = deepCopy(origin[key], target[key])
      }
    } else {
      // 基本类型直接赋值
      target = origin
    }
    return target
  }
  var newObj = {}
  var result = deepCopy(obj, newObj)
  console.log('result', result)
  obj.friends.push('Cherry')
  console.log('result.friends', result.friends)
  console.log('obj.friends', obj.friends)
</script>
</body>
</html>